package main

import (
	"fmt"
	"time"
)

func main() {

	// 定义一个有缓冲channel，容量为3，最多可以存放3个数据
	// 当容量满时，再往channel中存数据会阻塞。当容量为空时，再从channel中取数据会阻塞
	c := make(chan int, 3)
	fmt.Println("len(c) = ", len(c), ", cap(c) = ", cap(c))

	go func() {
		defer fmt.Println("子协程结束")

		for i := 0; i < 3; i++ {
			c <- i
			fmt.Println("子协程正在运行，写入管道的元素=", i, "，此时管道信息为len(c) = ", len(c), ", cap(c) = ", cap(c))
		}
	}()

	time.Sleep(2 * time.Second)

	for i := 0; i < 4; i++ {
		num := <-c
		fmt.Println("主协程正在运行，从管道获取的元素=", num)
	}
}
